home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 September / Amiga Games Extra CD-ROM 9-1996.iso / userbox / publicdomain / typeface / source / char.c next >
C/C++ Source or Header  |  1996-06-08  |  28KB  |  1,046 lines

  1. /*********************/
  2. /*             */
  3. /* Character editing */
  4. /*             */
  5. /*********************/
  6.  
  7. #include "Typeface.h"
  8.  
  9. struct Window *ResetKernWnd;
  10. Object *ResetKernWndObj, *ResetSpaceInt, *ResetKernInt;
  11.  
  12. ULONG PixelBorder = 1;
  13. extern struct Preferences Prefs;
  14.  
  15. struct VectorItem LineArrowLeft[] =
  16.   { 11,10,VIF_SCALE,
  17.     SHADOWPEN,0,VIF_DRIPEN,
  18.      2, 5,VIF_MOVE,
  19.      9, 2,VIF_DRAW,
  20.      9, 8,VIF_DRAW,
  21.      2, 5,VIF_DRAW,
  22.      0, 0,VIF_LASTITEM };
  23. struct VectorItem LineArrowRight[] =
  24.   { 11,10,VIF_SCALE,
  25.     SHADOWPEN,0,VIF_DRIPEN,
  26.      9, 5,VIF_MOVE,
  27.      2, 2,VIF_DRAW,
  28.      2, 8,VIF_DRAW,
  29.      9, 5,VIF_DRAW,
  30.      0, 0,VIF_LASTITEM };
  31. struct VectorItem SolidArrowLeft[] =
  32.   { 11,10,VIF_SCALE,
  33.     SHADOWPEN,0,VIF_AOLDRIPEN,
  34.      0, 0,VIF_AREASTART,
  35.      2, 5,VIF_MOVE,
  36.      9, 2,VIF_DRAW,
  37.      9, 8,VIF_DRAW,
  38.      2, 5,VIF_DRAW,
  39.      0, 0,VIF_AREAEND,
  40.      0, 0,VIF_LASTITEM };
  41. struct VectorItem SolidArrowRight[] =
  42.   { 11,10,VIF_SCALE,
  43.     SHADOWPEN,0,VIF_AOLDRIPEN,
  44.      0, 0,VIF_AREASTART,
  45.      9, 5,VIF_MOVE,
  46.      2, 2,VIF_DRAW,
  47.      2, 8,VIF_DRAW,
  48.      9, 5,VIF_DRAW,
  49.      0, 0,VIF_AREAEND,
  50.      0, 0,VIF_LASTITEM };
  51. struct VectorItem SolidArrowUp[] =
  52.   { 22,10,VIF_SCALE,
  53.     SHADOWPEN,0,VIF_AOLDRIPEN,
  54.      0, 0,VIF_AREASTART,
  55.     11, 2,VIF_MOVE,
  56.      5, 8,VIF_DRAW,
  57.     17, 8,VIF_DRAW,
  58.     11, 2,VIF_DRAW,
  59.      0, 0,VIF_AREAEND,
  60.      0, 0,VIF_LASTITEM };
  61. struct VectorItem SolidArrowDown[] =
  62.   { 22,11,VIF_SCALE,
  63.     SHADOWPEN,0,VIF_AOLDRIPEN,
  64.      0, 0,VIF_AREASTART,
  65.     11, 8,VIF_MOVE,
  66.      5, 2,VIF_DRAW,
  67.     17, 2,VIF_DRAW,
  68.     11, 8,VIF_DRAW,
  69.      0, 0,VIF_AREAEND,
  70.      0, 0,VIF_LASTITEM };
  71. struct VectorItem KernImage[] =
  72.   { 22,11,VIF_SCALE,
  73.     SHINEPEN,0,VIF_AOLDRIPEN,
  74.     SHINEPEN,0,VIF_DRIPEN,
  75.      0, 0,VIF_AREASTART,
  76.      4, 2,VIF_MOVE,
  77.      4, 8,VIF_DRAW,
  78.     10, 8,VIF_DRAW,
  79.      4, 2,VIF_DRAW,
  80.      0, 0,VIF_AREAEND,
  81.     SHADOWPEN,0,VIF_AOLDRIPEN,
  82.     SHADOWPEN,0,VIF_DRIPEN,
  83.      0, 0,VIF_AREASTART,
  84.     11, 2,VIF_MOVE,
  85.     17, 2,VIF_DRAW,
  86.     17, 8,VIF_DRAW,
  87.     11, 2,VIF_DRAW,
  88.      0, 0,VIF_AREAEND,
  89.      0, 0,VIF_LASTITEM };
  90. struct VectorItem WidthImage[] =
  91.   { 11,10,VIF_SCALE,
  92.     SHINEPEN,0,VIF_DRIPEN,
  93.     SHADOWPEN,0,VIF_AOLDRIPEN,
  94.      0, 0,VIF_AREASTART,
  95.      2, 5,VIF_MOVE,
  96.      9, 2,VIF_DRAW,
  97.      9, 8,VIF_DRAW,
  98.      2, 5,VIF_DRAW,
  99.      0, 0,VIF_AREAEND,
  100.      0, 0,VIF_LASTITEM };
  101. struct VectorItem ZoomInImage[] =
  102.   { 22,10,VIF_SCALE,
  103.     SHADOWPEN,0,VIF_DRIPEN,
  104.      5, 5,VIF_MOVE,
  105.     16, 5,VIF_DRAW,
  106.     10, 2,VIF_MOVE,
  107.     10, 8,VIF_DRAW,
  108.     11, 2,VIF_MOVE,
  109.     11, 8,VIF_DRAW,
  110.      0, 0,VIF_LASTITEM };
  111. struct VectorItem ZoomOutImage[] =
  112.   { 22,10,VIF_SCALE,
  113.     SHADOWPEN,0,VIF_DRIPEN,
  114.      5, 5,VIF_MOVE,
  115.     16, 5,VIF_DRAW,
  116.      0, 0,VIF_LASTITEM };
  117. struct VectorItem FlipHImage[] =
  118.   { 22,10,VIF_SCALE,
  119.     SHADOWPEN,0,VIF_DRIPEN,
  120.      4, 5,VIF_MOVE,
  121.     16, 5,VIF_DRAW,
  122.      0, 0,VIF_AREASTART,
  123.      7, 2,VIF_MOVE,
  124.      4, 5,VIF_DRAW,
  125.      7, 8,VIF_DRAW,
  126.      0, 0,VIF_AREAEND,
  127.      0, 0,VIF_AREASTART,
  128.     13, 2,VIF_MOVE,
  129.     16, 5,VIF_DRAW,
  130.     13, 8,VIF_DRAW,
  131.      0, 0,VIF_AREAEND,
  132.      0, 0,VIF_LASTITEM };
  133. struct VectorItem FlipVImage[] =
  134.   { 22,10,VIF_SCALE,
  135.     SHADOWPEN,0,VIF_DRIPEN,
  136.     11, 2,VIF_MOVE,
  137.     11, 8,VIF_DRAW,
  138.      0, 0,VIF_AREASTART,
  139.      6, 4,VIF_MOVE,
  140.     11, 2,VIF_DRAW,
  141.     16, 4,VIF_DRAW,
  142.      0, 0,VIF_AREAEND,
  143.      0, 0,VIF_AREASTART,
  144.      6, 6,VIF_MOVE,
  145.     11, 8,VIF_DRAW,
  146.     16, 6,VIF_DRAW,
  147.      0, 0,VIF_AREAEND,
  148.      0, 0,VIF_LASTITEM };
  149.  
  150. struct CharNode *OpenCharWin(ULONG charnum,struct IBox size)
  151. {
  152. extern struct Screen *Screen;
  153. extern struct List *CharWndList;
  154. extern struct MsgPort *WndMsgPort;
  155. extern struct Image *SizeImage, *LeftImage, *RightImage;
  156. extern struct Image *UpImage, *DownImage;
  157. extern Class *EditClass;
  158. extern struct Character CharBuffer[256];
  159. extern BOOL MaxWindow, ShowBLine, Toggle, DataChanged;
  160. extern ULONG Baseline;
  161. extern struct NewMenu CharMenus[];
  162.  
  163. struct CharNode *node;
  164. Object *extobj, *toolbarsub;
  165. ULONG gw,gh,top;
  166. UWORD width,height;
  167. static ULONG scroll2edit[] = { GA_ID,EG_Update,TAG_DONE };
  168.  
  169.   if ((node = (struct CharNode *)CreateNode(sizeof(struct CharNode),
  170.     CharWndList)) == NULL) Quit();
  171.   if ((node->chln_Title = AllocVec(256,MEMF_CLEAR)) == NULL)
  172.     ErrorCode(ALLOCVEC);
  173.   if (charnum > 0)
  174.   {
  175.     if (charnum == 256)
  176.       sprintf(node->chln_Title,GetString(msgBlankTitle));
  177.     else
  178.       sprintf(node->chln_Title,GetString(msgCharTitle),
  179.       (char)charnum,charnum,charnum);
  180.   }
  181.   else sprintf(node->chln_Title,GetString(msgZeroTitle));
  182.   if ((node->chln_Hook = AllocVec(sizeof(struct Hook),MEMF_CLEAR)) == NULL)
  183.     ErrorCode(ALLOCVEC);
  184.   node->chln_Hook->h_Entry = (HOOKFUNC)CharHook;
  185.   node->chln_Hook->h_Data = node;
  186.   node->chln_Character = CharBuffer+charnum;
  187.   node->chln_Number = charnum;
  188.   width = (Prefs.PixelX*node->chln_Character->chr_Width)+(2*EG_XOFFSET)+
  189.     (2*SizeX(4))+Screen->WBorLeft+UpImage->Width;
  190.   if (width < size.Width) size.Width = width;
  191.   if (MaxWindow) size.Width = width;
  192.   height = (Prefs.PixelY*node->chln_Character->chr_Height)+(2*EG_YOFFSET)+1+
  193.     (2*SizeY(2))+Screen->WBorTop+Screen->Font->ta_YSize+LeftImage->Height;
  194.   CopyChar(node,&(node->chln_UndoChar));
  195.  
  196.   node->chln_ToolBar =
  197.     BGUI_NewObject(BGUI_GROUP_GADGET,GROUP_Spacing,SizeX(4),TAG_DONE);
  198.   if (Prefs.ToolBar & (FTBAR_WIDTHL|FTBAR_WIDTHR))
  199.   {
  200.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  201.     if (Prefs.ToolBar & FTBAR_WIDTHL)
  202.     {
  203.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  204.     ButtonObject,
  205.       VIT_VectorArray,LineArrowLeft,
  206.       ButtonFrame,
  207.       GA_ID,ID_WIDTHL,
  208.     EndObject,
  209.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  210.       node->chln_ToolBarWidth += 22;
  211.     }
  212.     if (Prefs.ToolBar & FTBAR_WIDTHR)
  213.     {
  214.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  215.     ButtonObject,
  216.       VIT_VectorArray,LineArrowRight,
  217.       ButtonFrame,
  218.       GA_ID,ID_WIDTHR,
  219.     EndObject,
  220.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  221.       node->chln_ToolBarWidth += 22;
  222.     }
  223.     DoMethod(node->chln_ToolBar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  224.   }
  225.   if (Prefs.ToolBar & (FTBAR_MOVEL|FTBAR_MOVER|FTBAR_MOVEU|FTBAR_MOVED))
  226.   {
  227.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  228.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  229.     if (Prefs.ToolBar & FTBAR_MOVEL)
  230.     {
  231.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  232.     ButtonObject,
  233.       VIT_VectorArray,SolidArrowLeft,
  234.       ButtonFrame,
  235.       GA_ID,ID_MOVEL,
  236.     EndObject,
  237.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  238.       node->chln_ToolBarWidth += 22;
  239.     }
  240.     if (Prefs.ToolBar & FTBAR_MOVER)
  241.     {
  242.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  243.     ButtonObject,
  244.       VIT_VectorArray,SolidArrowRight,
  245.       ButtonFrame,
  246.       GA_ID,ID_MOVER,
  247.     EndObject,
  248.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  249.       node->chln_ToolBarWidth += 22;
  250.     }
  251.     if (Prefs.ToolBar & FTBAR_MOVEU)
  252.     {
  253.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  254.     ButtonObject,
  255.       VIT_VectorArray,SolidArrowUp,
  256.       ButtonFrame,
  257.       GA_ID,ID_MOVEU,
  258.     EndObject,
  259.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  260.       node->chln_ToolBarWidth += 22;
  261.     }
  262.     if (Prefs.ToolBar & FTBAR_MOVED)
  263.     {
  264.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  265.     ButtonObject,
  266.       VIT_VectorArray,SolidArrowDown,
  267.       ButtonFrame,
  268.       GA_ID,ID_MOVED,
  269.     EndObject,
  270.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  271.       node->chln_ToolBarWidth += 22;
  272.     }
  273.     DoMethod(node->chln_ToolBar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  274.   }
  275.   if (Prefs.ToolBar & (FTBAR_KERN|FTBAR_WIDTH))
  276.   {
  277.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  278.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  279.     if (Prefs.ToolBar & FTBAR_KERN)
  280.     {
  281.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  282.     ButtonObject,
  283.       VIT_VectorArray,KernImage,
  284.       ButtonFrame,
  285.       GA_ID,ID_KERNING,
  286.     EndObject,
  287.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  288.       node->chln_ToolBarWidth += 22;
  289.     }
  290.     if (Prefs.ToolBar & FTBAR_WIDTH)
  291.     {
  292.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  293.     ButtonObject,
  294.       VIT_VectorArray,WidthImage,
  295.       ButtonFrame,
  296.       GA_ID,ID_WIDTHC,
  297.     EndObject,
  298.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  299.       node->chln_ToolBarWidth += 22;
  300.     }
  301.     DoMethod(node->chln_ToolBar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  302.   }
  303.   if (Prefs.ToolBar & (FTBAR_ZOOMIN|FTBAR_ZOOMOUT))
  304.   {
  305.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  306.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  307.     if (Prefs.ToolBar & FTBAR_ZOOMIN)
  308.     {
  309.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  310.     ButtonObject,
  311.       VIT_VectorArray,ZoomInImage,
  312.       ButtonFrame,
  313.       GA_ID,ID_ZOOMIN,
  314.     EndObject,
  315.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  316.       node->chln_ToolBarWidth += 22;
  317.     }
  318.     if (Prefs.ToolBar & FTBAR_ZOOMOUT)
  319.     {
  320.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  321.     ButtonObject,
  322.       VIT_VectorArray,ZoomOutImage,
  323.       ButtonFrame,
  324.       GA_ID,ID_ZOOMOUT,
  325.     EndObject,
  326.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  327.       node->chln_ToolBarWidth += 22;
  328.     }
  329.     DoMethod(node->chln_ToolBar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  330.   }
  331.   if (Prefs.ToolBar & (FTBAR_FLIPH|FTBAR_FLIPV))
  332.   {
  333.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  334.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  335.     if (Prefs.ToolBar & FTBAR_FLIPH)
  336.     {
  337.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  338.     ButtonObject,
  339.       VIT_VectorArray,FlipHImage,
  340.       ButtonFrame,
  341.       GA_ID,ID_FLIPH,
  342.     EndObject,
  343.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  344.       node->chln_ToolBarWidth += 22;
  345.     }
  346.     if (Prefs.ToolBar & FTBAR_FLIPV)
  347.     {
  348.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  349.     ButtonObject,
  350.       VIT_VectorArray,FlipVImage,
  351.       ButtonFrame,
  352.       GA_ID,ID_FLIPV,
  353.     EndObject,
  354.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  355.       node->chln_ToolBarWidth += 22;
  356.     }
  357.     DoMethod(node->chln_ToolBar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  358.   }
  359.  
  360.   if (node->chln_ToolBarWidth > 0)
  361.   {
  362.     height += Prefs.VecHeight+SizeY(2);
  363.     node->chln_ToolBarHeight = Prefs.VecHeight+SizeY(2);
  364.   }
  365.   if (height < size.Height) size.Height = height;
  366.   SetupMenus(CharMenus);
  367.  
  368.   node->chln_Object = WindowObject,
  369.     WINDOW_Screen,Screen,
  370.     WINDOW_SharedPort,WndMsgPort,
  371.     WINDOW_MenuStrip,CharMenus,
  372.     WINDOW_Title,node->chln_Title,
  373.     WINDOW_Bounds,&size,
  374.     WINDOW_HelpFile,NAME".guide",
  375.     WINDOW_HelpNode,"char",
  376.     WINDOW_IDCMPHook,node->chln_Hook,
  377.     WINDOW_IDCMPHookBits,IDCMP_CHANGEWINDOW|IDCMP_RAWKEY,
  378.     WINDOW_SizeRight,TRUE,
  379.     WINDOW_SizeBottom,TRUE,
  380.     WINDOW_CloseOnEsc,TRUE,
  381.     WINDOW_MasterGroup,
  382.       node->chln_WinGroup = VGroupObject,
  383.     HOffset(SizeX(4)),VOffset(SizeY(2)),Spacing(SizeY(2)),
  384.     StartMember,
  385.       extobj = ExternalObject,
  386.         EXT_MinWidth,(2*Prefs.PixelX)+(2*EG_XOFFSET)-2,
  387.         EXT_MinHeight,(2*Prefs.PixelY)+(2*EG_YOFFSET)-2,
  388.         EXT_Class,EditClass,
  389.         EXT_NoRebuild,TRUE,
  390.         EG_PixelX,Prefs.PixelX,
  391.         EG_PixelY,Prefs.PixelY,
  392.         EG_CharNode,node,
  393.         EG_CharStruct,node->chln_Character,
  394.         EG_PixelBorder,PixelBorder,
  395.         EG_ShowBaseline,ShowBLine,
  396.         EG_Toggle,Toggle,
  397.         EG_Baseline,Baseline,
  398.         EG_ChangePtr,&DataChanged,
  399.         GA_Disabled,FALSE,
  400.         GA_ID,ID_EDIT,
  401.       EndObject,
  402.     EndMember,
  403.       EndObject,
  404.     EndObject;
  405.   if (node->chln_Object == NULL) ErrorCode(NEWWINDOW);
  406.   node->chln_MinPixelX = Prefs.PixelX;
  407.   node->chln_MinPixelY = Prefs.PixelY;
  408.   node->chln_CurPixelX = node->chln_MinPixelX;
  409.   node->chln_CurPixelY = node->chln_MinPixelY;
  410.   if (node->chln_ToolBarHeight > 0) DoMethod(node->chln_WinGroup,
  411.     GRM_INSERTMEMBER,node->chln_ToolBar,NULL,FixMinSize,TAG_DONE);
  412.   if ((node->chln_Window = WindowOpen(node->chln_Object)) == NULL)
  413.     ErrorCode(OPENWINDOW);
  414.  
  415.   gh = MAX(LeftImage->Height,RightImage->Height);
  416.   gh = MAX(SizeImage->Height,gh);
  417.   gw = MAX(UpImage->Width,DownImage->Width);
  418.   gw = MAX(SizeImage->Width,gw);
  419.   top = Screen->WBorTop+Screen->Font->ta_YSize+1;
  420.   GetAttr(EXT_Object,extobj,(ULONG *)&(node->chln_EditGadg));
  421.  
  422.   if ((node->chln_HorizGadg = CreatePropGadg(FREEHORIZ,
  423.     GA_Left,3,
  424.     GA_RelBottom,3-gh,
  425.     GA_RelWidth,-5-gw-LeftImage->Width-RightImage->Width,
  426.     GA_Height,gh-4,
  427.     GA_BottomBorder,TRUE,
  428.     GA_ID,GADG_HORIZ,
  429.     ICA_TARGET,node->chln_EditGadg,
  430.     ICA_MAP,scroll2edit,
  431.     PGA_Total,node->chln_Character->chr_Width,
  432.     PGA_Visible,node->chln_Character->chr_Width,TAG_DONE)) == NULL)
  433.       ErrorCode(NEWPROP);
  434.   if ((node->chln_VertGadg = CreatePropGadg(FREEVERT,
  435.     GA_RelRight,5-gw,
  436.     GA_Top,top+1,
  437.     GA_Width,gw-8,
  438.     GA_RelHeight,-top-SizeImage->Height-UpImage->Height-DownImage->Height-2,
  439.     GA_RightBorder,TRUE,
  440.     GA_Previous,node->chln_HorizGadg,
  441.     GA_ID,GADG_VERT,
  442.     ICA_TARGET,node->chln_EditGadg,
  443.     ICA_MAP,scroll2edit,
  444.     PGA_Total,node->chln_Character->chr_Height,
  445.     PGA_Visible,node->chln_Character->chr_Height,TAG_DONE)) == NULL)
  446.       ErrorCode(NEWPROP);
  447.  
  448.   if ((node->chln_LeftGadg = CreateButtonGadg((Object *)LeftImage,
  449.     GA_RelRight,1-LeftImage->Width-RightImage->Width-gw,
  450.     GA_RelBottom,1-LeftImage->Height,
  451.     GA_BottomBorder,TRUE,
  452.     GA_Previous,node->chln_VertGadg,
  453.     GA_ID,GADG_LEFT,
  454.     ICA_TARGET,node->chln_EditGadg,
  455.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  456.   if ((node->chln_RightGadg = CreateButtonGadg((Object *)RightImage,
  457.     GA_RelRight,1-RightImage->Width-gw,
  458.     GA_RelBottom,1-RightImage->Height,
  459.     GA_BottomBorder,TRUE,
  460.     GA_Previous,node->chln_LeftGadg,
  461.     GA_ID,GADG_RIGHT,
  462.     ICA_TARGET,node->chln_EditGadg,
  463.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  464.   if ((node->chln_UpGadg = CreateButtonGadg((Object *)UpImage,
  465.     GA_RelRight,1-UpImage->Width,
  466.     GA_RelBottom,1-UpImage->Height-DownImage->Height-SizeImage->Height,
  467.     GA_RightBorder,TRUE,
  468.     GA_Previous,node->chln_RightGadg,
  469.     GA_ID,GADG_UP,
  470.     ICA_TARGET,node->chln_EditGadg,
  471.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  472.   if ((node->chln_DownGadg = CreateButtonGadg((Object *)DownImage,
  473.     GA_RelRight,1-DownImage->Width,
  474.     GA_RelBottom,1-DownImage->Height-SizeImage->Height,
  475.     GA_RightBorder,TRUE,
  476.     GA_Previous,node->chln_UpGadg,
  477.     GA_ID,GADG_DOWN,
  478.     ICA_TARGET,node->chln_EditGadg,
  479.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  480.  
  481.   AddGList(node->chln_Window,(struct Gadget *)node->chln_HorizGadg,-1,-1,
  482.     NULL);
  483.   SetScrollers(node);
  484.   RefreshGList((struct Gadget *)node->chln_HorizGadg,node->chln_Window,
  485.     NULL,-1);
  486. }
  487.  
  488. void CloseCharWin(struct CharNode *node)
  489. {
  490. extern struct Window *WidthWnd, *KernWnd;
  491. extern struct CharNode *WidthNode, *KernNode;
  492.  
  493.   ClrWindowClose(&(node->chln_Object),&(node->chln_Window));
  494.   if (node->chln_ToolBarHeight > 0) DoMethod(node->chln_WinGroup,
  495.     GRM_REMMEMBER,node->chln_ToolBar,TAG_DONE);
  496.   ClrDisposeObject(&(node->chln_ToolBar));
  497.   ClrDisposeObject(&(node->chln_Object));
  498.   if (node->chln_Title)
  499.   {
  500.     FreeVec(node->chln_Title);
  501.     node->chln_Title = NULL;
  502.   }
  503.   ClrDisposeObject(&(node->chln_HorizGadg));
  504.   ClrDisposeObject(&(node->chln_VertGadg));
  505.   ClrDisposeObject(&(node->chln_LeftGadg));
  506.   ClrDisposeObject(&(node->chln_RightGadg));
  507.   ClrDisposeObject(&(node->chln_UpGadg));
  508.   ClrDisposeObject(&(node->chln_DownGadg));
  509.   if (node->chln_Hook)
  510.   {
  511.     FreeVec(node->chln_Hook);
  512.     node->chln_Hook = NULL;
  513.   }
  514.   if ((WidthWnd) && (WidthNode == node)) CloseWidthWnd(FALSE);
  515.   if ((KernWnd) && (KernNode == node)) CloseKernWnd(FALSE);
  516.   if (node->chln_UndoChar.chr_Data);
  517.   {
  518.     FreeVec(node->chln_UndoChar.chr_Data);
  519.     node->chln_UndoChar.chr_Data = NULL;
  520.   }
  521. }
  522.  
  523. Object *CreateSysImage(ULONG which,struct DrawInfo *dri)
  524. {
  525.   return (NewObject(NULL,SYSICLASS,
  526.     SYSIA_DrawInfo,dri,
  527.     SYSIA_Which,which,TAG_DONE));
  528. }
  529.  
  530. Object *CreatePropGadg(ULONG freedom,Tag tag1,...)
  531. {
  532.   return (NewObject(NULL,PROPGCLASS,
  533.     PGA_Freedom,freedom,
  534.     PGA_NewLook,TRUE,
  535.     PGA_Borderless,TRUE,
  536.     TAG_MORE,&tag1));
  537. }
  538.  
  539. Object *CreateButtonGadg(Object *image,Tag tag1,...)
  540. {
  541.   return (NewObject(NULL,BUTTONGCLASS,
  542.     GA_Image,image,
  543.     TAG_MORE,&tag1));
  544. }
  545.  
  546. __geta4 void CharHook(__a0 struct Hook *hook, __a2 Object *o,
  547.   __a1 struct IntuiMessage *msg)
  548. {
  549. struct InputEvent *ievent;
  550. char trans[2];
  551.  
  552.   switch (msg->Class)
  553.   {
  554.     case IDCMP_CHANGEWINDOW:
  555.       if (msg->Code == CWCODE_MOVESIZE) ForceResizeChar(hook->h_Data);
  556.       break;
  557.     case IDCMP_RAWKEY:
  558.       if (ievent = AllocVec(sizeof(struct InputEvent),MEMF_CLEAR))
  559.       {
  560.     ievent->ie_Class = IECLASS_RAWKEY;
  561.     ievent->ie_Code = msg->Code;
  562.     ievent->ie_Qualifier = msg->Qualifier;
  563.     MapRawKey(ievent,trans,1,NULL);
  564.     FreeVec(ievent);
  565.     switch (trans[0])
  566.     {
  567.       case '+':
  568.         ZoomIn(hook->h_Data);
  569.         break;
  570.       case '-':
  571.         ZoomOut(hook->h_Data);
  572.         break;
  573.     }
  574.       }
  575.       break;
  576.   }
  577. }
  578.  
  579. void ForceResizeChar(struct CharNode *node)
  580. {
  581. struct Character *chr;
  582. LONG l,t,w,h;
  583.  
  584.   chr = node->chln_Character;
  585.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  586.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  587.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  588.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  589.   if (chr->chr_Width - l < w) l = chr->chr_Width - w;
  590.   if (l < 0) l = 0;
  591.   if (chr->chr_Height - t < h) t = chr->chr_Height - h;
  592.   if (t < 0) t = 0;
  593.   SetGadgetAttrs((struct Gadget *)node->chln_EditGadg,node->chln_Window,
  594.     NULL,EG_XOffset,l,EG_YOffset,t,TAG_DONE);
  595.   SetScrollers(node);
  596. }
  597.  
  598. void SetScrollers(struct CharNode *node)
  599. {
  600. ULONG l,t,w,h;
  601.  
  602.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  603.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  604.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  605.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  606.   SetGadgetAttrs((struct Gadget *)node->chln_HorizGadg,node->chln_Window,
  607.     NULL,PGA_Top,l,PGA_Visible,w,TAG_DONE);
  608.   SetGadgetAttrs((struct Gadget *)node->chln_VertGadg,node->chln_Window,
  609.     NULL,PGA_Top,t,PGA_Visible,h,TAG_DONE);
  610. }
  611.  
  612. void RedrawEdit(struct CharNode *node)
  613. {
  614.   SetGadgetAttrs((struct Gadget *)node->chln_HorizGadg,node->chln_Window,
  615.     NULL,PGA_Total,node->chln_Character->chr_Width,TAG_DONE);
  616.   SetGadgetAttrs((struct Gadget *)node->chln_VertGadg,node->chln_Window,
  617.     NULL,PGA_Total,node->chln_Character->chr_Height,TAG_DONE);
  618.   SetGadgetAttrs((struct Gadget *)node->chln_EditGadg,node->chln_Window,
  619.     NULL,
  620.     EG_Baseline,Baseline,
  621.     EG_Update,GADG_NONE,TAG_DONE);
  622.   ForceResizeChar(node);
  623. }
  624.  
  625. void MoveLeft(struct CharNode *node,struct Character *chr)
  626. {
  627. ULONG i,j;
  628.  
  629.   if (node != NULL) chr = node->chln_Character;
  630.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  631.   {
  632.     for (j = 0; j < chr->chr_Height; j++)
  633.     {
  634.       for (i = 0; i < chr->chr_Width-1; i++) DATA(i,j) = DATA(i+1,j);
  635.       DATA(chr->chr_Width-1,j) = 0;
  636.     }
  637.     if (node != NULL) RedrawEdit(node);
  638.   }
  639. }
  640.  
  641. void MoveRight(struct CharNode *node,struct Character *chr)
  642. {
  643. ULONG i,j;
  644.  
  645.   if (node != NULL) chr = node->chln_Character;
  646.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  647.   {
  648.     for (j = 0; j < chr->chr_Height; j++)
  649.     {
  650.       for (i = chr->chr_Width-1; i > 0; i--) DATA(i,j) = DATA(i-1,j);
  651.       DATA(0,j) = 0;
  652.     }
  653.     if (node != NULL) RedrawEdit(node);
  654.   }
  655. }
  656.  
  657. void MoveUp(struct CharNode *node,struct Character *chr)
  658. {
  659. ULONG i,j;
  660.  
  661.   if (node != NULL) chr = node->chln_Character;
  662.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  663.   {
  664.     for (i = 0; i < chr->chr_Width; i++)
  665.     {
  666.       for (j = 0; j < chr->chr_Height-1; j++) DATA(i,j) = DATA(i,j+1);
  667.       DATA(i,chr->chr_Height-1) = 0;
  668.     }
  669.     if (node != NULL) RedrawEdit(node);
  670.   }
  671. }
  672.  
  673. void MoveDown(struct CharNode *node,struct Character *chr)
  674. {
  675. ULONG i,j;
  676.  
  677.   if (node != NULL) chr = node->chln_Character;
  678.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  679.   {
  680.     for (i = 0; i < chr->chr_Width; i++)
  681.     {
  682.       for (j = chr->chr_Height-1; j > 0; j--) DATA(i,j) = DATA(i,j-1);
  683.       DATA(i,0) = 0;
  684.     }
  685.     if (node != NULL) RedrawEdit(node);
  686.   }
  687. }
  688.  
  689. void MoveAll(void (*MoveFunction)())
  690. {
  691. struct Character *chr;
  692. ULONG i;
  693.  
  694.   for (i = 0; i < 257; i++)
  695.   {
  696.     chr = CharBuffer+i;
  697.     MoveFunction(NULL,chr);
  698.   }
  699.   RedrawAll();
  700. }
  701.  
  702. void RedrawAll()
  703. {
  704. struct CharNode *node;
  705.  
  706.   node = (struct CharNode *)CharWndList->lh_Head;
  707.   while (node->chln_Node.ln_Succ)
  708.   {
  709.     RedrawEdit(node);
  710.     CheckWidthKern(node->chln_Character);
  711.     node = (struct CharNode *)node->chln_Node.ln_Succ;
  712.   }
  713. }
  714.  
  715. void ZoomIn(struct CharNode *node)
  716. {
  717. ULONG x,y,max_x,max_y;
  718.  
  719.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  720.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  721.  
  722.   max_x = node->chln_Window->Width-(2*EG_XOFFSET)-(2*SizeX(4))-
  723.     Screen->WBorLeft-UpImage->Width;
  724.   max_y = node->chln_Window->Height-(2*EG_YOFFSET)-1-(2*SizeY(2))-
  725.     Screen->WBorTop-Screen->Font->ta_YSize-LeftImage->Height-
  726.     node->chln_ToolBarHeight;
  727.  
  728.   if ((x*4 <= max_x) && (y*4 <= max_y))
  729.   {
  730.     SetGadgetAttrs((struct Gadget *)node->chln_EditGadg,node->chln_Window,
  731.       NULL,
  732.       EG_PixelX,x*2,
  733.       EG_PixelY,y*2,
  734.       EG_Update,GADG_NONE,TAG_DONE);
  735.     SetScrollers(node);
  736.     SetMinWindowSize(node,x);
  737.   }
  738.   else DisplayBeep(node->chln_Window->WScreen);
  739. }
  740.  
  741. void ZoomOut(struct CharNode *node)
  742. {
  743. ULONG x,y;
  744.  
  745.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  746.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  747.  
  748.   if ((x/2 >= 2) && (y/2 >= 2))
  749.   {
  750.     SetGadgetAttrs((struct Gadget *)node->chln_EditGadg,node->chln_Window,
  751.       NULL,
  752.       EG_PixelX,x/2,
  753.       EG_PixelY,y/2,
  754.       EG_Update,GADG_NONE,TAG_DONE);
  755.     SetScrollers(node);
  756.     SetMinWindowSize(node,x);
  757.   }
  758.   else DisplayBeep(node->chln_Window->WScreen);
  759. }
  760.  
  761. void SetMinWindowSize(struct CharNode *node, ULONG oldx)
  762. {
  763. ULONG x,y;
  764.  
  765.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  766.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  767.  
  768.   if (2*(oldx+EG_XOFFSET) < node->chln_ToolBarWidth)
  769.   {
  770.     if (2*(x+EG_XOFFSET) > node->chln_ToolBarWidth)
  771.     {
  772.       node->chln_Window->MinWidth -= node->chln_ToolBarWidth;
  773.       node->chln_Window->MinWidth += 2*(x+EG_XOFFSET);
  774.     }
  775.   }
  776.   else
  777.   {
  778.     if (2*(x+EG_XOFFSET) < node->chln_ToolBarWidth)
  779.     {
  780.       node->chln_Window->MinWidth += node->chln_ToolBarWidth;
  781.       node->chln_Window->MinWidth -= 2*(node->chln_CurPixelX+EG_XOFFSET);
  782.     }
  783.     else
  784.     {
  785.       node->chln_Window->MinWidth += 2*MAX(x,node->chln_MinPixelX);
  786.       node->chln_Window->MinWidth -= 2*node->chln_CurPixelX;
  787.     }
  788.   }
  789.   node->chln_CurPixelX = MAX(x,node->chln_MinPixelX);
  790.  
  791.   node->chln_Window->MinHeight += 2*MAX(y,node->chln_MinPixelY);
  792.   node->chln_Window->MinHeight -= 2*node->chln_CurPixelY;
  793.   node->chln_CurPixelY = MAX(y,node->chln_MinPixelY);
  794. }
  795.  
  796. void CopyChar(struct CharNode *node,struct Character *copyto)
  797. {
  798. struct Character *chr;
  799.  
  800.   chr = node->chln_Character;
  801.   if ((chr->chr_Width > 0) && (chr->chr_Data))
  802.   {
  803.     if (copyto->chr_Data) FreeVec(copyto->chr_Data);
  804.     copyto->chr_Data = NULL;
  805.     copyto->chr_Width = chr->chr_Width;
  806.     copyto->chr_Height = chr->chr_Height;
  807.     if ((copyto->chr_Data = AllocVec(chr->chr_Width*chr->chr_Height,
  808.       MEMF_CLEAR)) == NULL) ErrorCode(ALLOCVEC);
  809.     CopyMem(chr->chr_Data,copyto->chr_Data,chr->chr_Width*chr->chr_Height);
  810.   }
  811. }
  812.  
  813. void PasteChar(struct CharNode *node,struct Character *pastefrom)
  814. {
  815. struct Character *chr;
  816. ULONG i;
  817. extern ULONG Proportional;
  818.  
  819.   chr = node->chln_Character;
  820.   if (pastefrom->chr_Data)
  821.   {
  822.     if (chr->chr_Data) FreeVec(chr->chr_Data);
  823.     chr->chr_Data = NULL;
  824.     if (Proportional) chr->chr_Width = pastefrom->chr_Width;
  825.     if (chr->chr_Width > 0)
  826.     {
  827.       if ((chr->chr_Data = AllocVec(chr->chr_Width*chr->chr_Height,
  828.     MEMF_CLEAR)) == NULL) ErrorCode(ALLOCVEC);
  829.       for (i = 0; i < MIN(chr->chr_Height,pastefrom->chr_Height); i++)
  830.     CopyMem(pastefrom->chr_Data+(i*pastefrom->chr_Width),
  831.     chr->chr_Data+(i*chr->chr_Width),
  832.     MIN(chr->chr_Width,pastefrom->chr_Width));
  833.     }
  834.     RedrawEdit(node);
  835.   }
  836. }
  837.  
  838. void EraseChar(struct CharNode *node)
  839. {
  840. struct Character *chr;
  841. int i;
  842.  
  843.   chr = node->chln_Character;
  844.   if ((chr->chr_Width > 0) && (chr->chr_Data))
  845.   {
  846.     for (i = 0; i < chr->chr_Width * chr->chr_Height; i++)
  847.       *(chr->chr_Data + i) = 0;
  848.     RedrawEdit(node);
  849.   }
  850. }
  851.  
  852. void SwapBytes(UBYTE *ptr,int i,int j)
  853. {
  854. UBYTE temp;
  855.  
  856.   temp = *(ptr+i);
  857.   *(ptr+i) = *(ptr+j);
  858.   *(ptr+j) = temp;
  859. }
  860.  
  861. void FlipHoriz(struct CharNode *node)
  862. {
  863. struct Character *chr;
  864. int i,j;
  865.  
  866.   chr = node->chln_Character;
  867.   if ((chr->chr_Width > 0) && (chr->chr_Data))
  868.   {
  869.     for (i = 0; i < chr->chr_Height; i++)
  870.     {
  871.       for (j = 0; j < chr->chr_Width / 2; j++)
  872.     SwapBytes(chr->chr_Data,(i*chr->chr_Width)+j,(i*chr->chr_Width)+chr->chr_Width-j-1);
  873.     }
  874.     RedrawEdit(node);
  875.   }
  876. }
  877.  
  878. void FlipVert(struct CharNode *node)
  879. {
  880. struct Character *chr;
  881. int i,j;
  882.  
  883.   chr = node->chln_Character;
  884.   if ((chr->chr_Width > 0) && (chr->chr_Data))
  885.   {
  886.     for (j = 0; j < chr->chr_Width; j++)
  887.     {
  888.       for (i = 0; i < chr->chr_Height / 2; i++)
  889.     SwapBytes(chr->chr_Data,(i*chr->chr_Width)+j,((chr->chr_Height-i-1)*chr->chr_Width)+j);
  890.     }
  891.     RedrawEdit(node);
  892.   }
  893. }
  894.  
  895. void OpenResetKernWnd(void)
  896. {
  897. Object *reset, *cancel;
  898. char *warn;
  899. extern struct NewMenu Menus[];
  900.  
  901.   if (ResetKernWnd)
  902.   {
  903.     WindowToFront(ResetKernWnd);
  904.     ActivateWindow(ResetKernWnd);
  905.   }
  906.   else
  907.   {
  908.     if (ResetKernWndObj == NULL)
  909.     {
  910.       SetupMenus(Menus);
  911.       warn = GetString(infoWarnReset);
  912.       ResetKernWndObj = WindowObject,
  913.     WINDOW_Screen,Screen,
  914.     WINDOW_SharedPort,WndMsgPort,
  915.     WINDOW_MenuStrip,Menus,
  916.     WINDOW_Title,GetString(msgResetTitle),
  917.     WINDOW_HelpFile,NAME".guide",
  918.     WINDOW_HelpNode,"resetkern",
  919.     WINDOW_SmartRefresh,TRUE,
  920.     WINDOW_SizeGadget,FALSE,
  921.     WINDOW_CloseOnEsc,TRUE,
  922.     WINDOW_MasterGroup,
  923.       VGroupObject,
  924.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  925.         GROUP_BackFill,SHINE_RASTER,
  926.         StartMember,
  927.           VGroupObject,
  928.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  929.         ButtonFrame,
  930.         FRM_Recessed,TRUE,
  931.         StartMember,
  932.           HGroupObject,
  933.             VarSpace(50),
  934.             StartMember,
  935.               VGroupObject,
  936.             Spacing(SizeY(2)),
  937.             StartMember,
  938.               ResetSpaceInt = StringObject,
  939.                 RidgeFrame,
  940.                 UScoreLabel(GetString(gadgSpacing),'_'),
  941.                 STRINGA_LongVal,0,
  942.                 STRINGA_MaxChars,5,
  943.                 STRINGA_MinCharsVisible,5,
  944.                 GA_TabCycle,TRUE,
  945.               EndObject,
  946.             EndMember,
  947.                 StartMember,
  948.               ResetKernInt = StringObject,
  949.                 RidgeFrame,
  950.                 UScoreLabel(GetString(gadgKerning),'_'),
  951.                 STRINGA_LongVal,0,
  952.                 STRINGA_MaxChars,5,
  953.                 STRINGA_MinCharsVisible,5,
  954.                 GA_TabCycle,TRUE,
  955.               EndObject,
  956.             EndMember,
  957.               EndObject,
  958.             EndMember,
  959.             StartMember,
  960.               VGroupObject,
  961.             StartMember,
  962.               InfoObject,
  963.                 INFO_MinLines,1,
  964.                 INFO_HorizOffset,6,
  965.                 INFO_VertOffset,3,
  966.                 INFO_TextFormat,GetString(infoPlusWidth),
  967.                 INFO_FixTextWidth,TRUE,
  968.               EndObject,
  969.             EndMember,
  970.             VarSpace(1000),
  971.               EndObject,
  972.             EndMember,
  973.             VarSpace(50),
  974.           EndObject,
  975.         EndMember,
  976.         StartMember,
  977.           InfoObject,
  978.             INFO_MinLines,3,
  979.             INFO_HorizOffset,0,
  980.             INFO_VertOffset,0,
  981.             INFO_TextFormat,"\33c%s",
  982.             INFO_Args,&warn,
  983.             INFO_FixTextWidth,TRUE,
  984.           EndObject,
  985.         EndMember,
  986.           EndObject,
  987.         EndMember,
  988.         StartMember,
  989.           HGroupObject,
  990.         Spacing(SizeX(8)),
  991.         StartMember,
  992.           reset = KeyButton(GetString(gadgReset),ID_ACCEPT),
  993.         EndMember,
  994.             StartMember,
  995.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  996.         EndMember,
  997.           EndObject,
  998.           FixMinHeight,
  999.         EndMember,
  1000.       EndObject,
  1001.     EndObject;
  1002.       if (ResetKernWndObj == NULL) ErrorCode(NEWWINDOW);
  1003.       SetLabelKey(ResetKernWndObj,ResetSpaceInt,gadgSpacing);
  1004.       SetLabelKey(ResetKernWndObj,ResetKernInt,gadgKerning);
  1005.       SetLabelKey(ResetKernWndObj,reset,gadgReset);
  1006.       SetLabelKey(ResetKernWndObj,cancel,gadgCancel);
  1007.       DoMethod(ResetKernWndObj,WM_TABCYCLE_ORDER,
  1008.     ResetSpaceInt,ResetKernInt,NULL);
  1009.     }
  1010.  
  1011.     if ((ResetKernWnd = WindowOpen(ResetKernWndObj)) == NULL)
  1012.       ErrorCode(OPENWINDOW);
  1013.   }
  1014. }
  1015.  
  1016. void CloseResetKernWnd(BOOL obj)
  1017. {
  1018.   ClrWindowClose(&ResetKernWndObj,&ResetKernWnd);
  1019.   if (obj) ClrDisposeObject(&ResetKernWndObj);
  1020. }
  1021.  
  1022. void ResetKerning(WORD space,WORD kern)
  1023. {
  1024. extern WORD SpaceTable[], KernTable[];
  1025. extern struct Character *KernChar;
  1026. extern Object *KernObj;
  1027. struct CharNode *node;
  1028. int i;
  1029.  
  1030.   for (i = 0; i < 257; i++)
  1031.   {
  1032.     SpaceTable[i] = (CharBuffer+i)->chr_Width + space;
  1033.     KernTable[i] = kern;
  1034.   }
  1035.   node = (struct CharNode *)CharWndList->lh_Head;
  1036.   while (node->chln_Node.ln_Succ)
  1037.   {
  1038.     CheckWidthKern(node->chln_Character);
  1039.     if (node->chln_Character == KernChar)
  1040.       SetGadgetAttrs((struct Gadget *)KernObj,KernWnd,NULL,
  1041.       STRINGA_LongVal,KernTable[node->chln_Number],TAG_DONE);
  1042.     node = (struct CharNode *)node->chln_Node.ln_Succ;
  1043.   }
  1044.   RedrawAll();
  1045. }
  1046.